﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cotizav.LogicaNegocio
{
    public class DistritoBLL
    {
        public List<Entidades.Distrito> Listar()
        {
            AccesoDatos.DistritoDAO distritoDAO = new AccesoDatos.DistritoDAO();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                return distritoDAO.Listar(ctx);
            }
        }



        public int Eliminar(Entidades.Distrito selDistrito)
        {
            AccesoDatos.DistritoDAO distritoDAO = new AccesoDatos.DistritoDAO();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                return distritoDAO.Eliminar(ctx, selDistrito);
            }
        }

        public int Eliminar(Entidades.Provincia selProvincia)
        {
            List<Entidades.Distrito> lista = Listar().Where(x => (x.IdProvincia.HasValue ? x.IdProvincia : -1) == selProvincia.IdProvincia).ToList();
            int resultado = 0;

            if (lista.Count > 0)
            {
                foreach (Entidades.Distrito d in lista)
                {
                    resultado += Eliminar(d);
                }
            }
            else
            {
                resultado = 1;
            }

            return resultado;
        }

        public List<Entidades.Distrito> ListarDistrito(int selectedIdProvincia)
        {
            return Listar().Where(x => (x.IdProvincia.HasValue ? x.IdProvincia.Value : -1) == selectedIdProvincia).ToList();
        }

        public Entidades.Distrito ObtenerDistrito(int selectedidDistrito)
        {
            return Listar().SingleOrDefault(x => x.IdDistrito == selectedidDistrito);
        }

        public int Guardar(Entidades.Distrito newDistrito)
        {
            if (string.IsNullOrWhiteSpace(newDistrito.NombreDistrito))
            {
                throw new ApplicationException("El Nombre del distrito se encuentra vacío");
            }

            AccesoDatos.DistritoDAO distritoDAO = new AccesoDatos.DistritoDAO();
            int resultado = 0;

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                ctx.LoadTransaction();
                resultado = distritoDAO.Registrar(ctx, newDistrito);
                ctx.ConfirmarTx();
            }

            return resultado;
        }

        public int Actualizar(Entidades.Distrito updDistrito)
        {
            if(string.IsNullOrWhiteSpace(updDistrito.NombreDistrito))
            {
                throw new ApplicationException("El nombre del distrito se encuentra vacío");
            }

            if (updDistrito.IdProvincia.Value <= 0)
            {
                throw new ApplicationException("La provincia no se encuentra asignada");
            }

            AccesoDatos.DistritoDAO distritoDAO = new AccesoDatos.DistritoDAO();
            int resultado = 0;

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                ctx.LoadTransaction();
                resultado = distritoDAO.Actualizar(ctx, updDistrito);
                ctx.ConfirmarTx();
            }

            return resultado;
        }
    }
}
